#include "LogFile.h"
#include "fileDetails.h"
// extern LogFile *logFile;
// extern node *node;

#ifndef FILE
#define FILE

class fileConfig 
{
public:
	// uint32_t cacheSpaceOccupied;
	// std::deque<int> LRU;

	std::map<int,fileDetails> fileMap;
    std::map<int,std::string> searchResponses;
    std::map<string,std::list<int> > name_index;
    std::map<string,std::list<int> > sha1_index;
    std::map<string,std::list<int> > kwrd_index;
    LogFile *name_index_file;
    LogFile *sha1_index_file;
    LogFile *kwrd_index_file;
  

    // void RecoverFilesMap();
	fileConfig();
    void CreateMetaDataFile(char **commaindexndString, string index_str);
    bool WriteToPermanentLocation(string filename, string index, int offset);
    //string calculateBitVector(list<string> keywords, bitset<1024> *bitVector);
    // void CreateMetaDataFileAndObjFromMsgData(char *dataFilename, string index_str,int mdStartOffset,bool isFilePerm);
    // void UpdateMapsAndFiles(string, string, string, string, string);
	void UpdateIndexFiles(string filename,string sha1,string bitvector);
    // pthread_mutex_t filesLock;
    // pthread_mutex_t nameLock;
    // pthread_mutex_t sha1Lock;
    // pthread_mutex_t kwrdLock;

    
    // void Load();
    // void PrintMaps();
    // void RecoverIndices();
    bool StoreAtPermanentLocation(char **cmdLineData);
    // string getFileMetadata(string index_str);
    // Message CreateSearchResponse(Message searchReq, int *totalResults);
    // Metadata getMetadataForIndex(int index);

    // std::map<int,FileInfo> getFiles() const;
    // std::map<string,std::list<int> > getKwrd_index() const;
    // std::map<string,std::list<int> > getName_index() const;
    // std::map<string,std::list<int> > getSha1_index() const;
    // void setName_index(std::map<string,std::list<int> > name_index);
    // int storeFileFromRequest(Message storeRequest, int fileStartOffset,int mdStartOffset,bool isfileperm);
    // void allMapsLock();
    // void allMapsUnlock();
    // std::list<int> getFilesIndices();
    // std::list<int> getSearchIndices(string data, int searchType);
    // void CheckAndGenerateSearchResponseMapForMyNode(char *data, int cmdType);
    // void addSearchResponseToMap(Message searchResponse);
    // void clearSearchResponsesMap();
    // bool SearchKeywords(std::list<string>, int index);
    // Message SendGetReqForResponseNo(int responseNo);
    // std::map<int,std::string> getSearchResponses() const;
    // int getIndexforFileIDandSHA1(char *fileID,char *SHA1);
    // Message createGetResponse(Message getRequest,int index);
    // bool IsFilePresent(string filename,string sha1,string nonce);
    // void serveDeleteRequest(string filename,string sha1,string nonce,string password);
    void printIndexDetails();
	void bitvector(list<string> keywords);
    // void deleteFileAtIndex(int index);
    // void storeFileToCWD(Message request,int offset,string filename,int index);
};

#endif 
